package backend

import (
	"fmt"
	"math"
)

// MSEData 定义MSE数据结构
type MSEData struct {
	Date              *string  // 采集日期
	Time              *string  // 采集时间
	Depth             *float64 // 深度
	TQSurf            *float64 // 顶驱扭矩
	RPMSurf           *float64 // 顶驱转速
	VerticalPipePress *float64 // 立管压力
	Q                 *float64 // 入口流量
	ROP               *float64 // 钻时
	WOB               *float64 // 钻压
}

// TransformObj 数据转换，把国际单位转为英制
func TransformObj(obj MSEData) MSEData {
	result := obj

	// 顶驱扭矩
	if result.TQSurf != nil {
		val := *result.TQSurf * 1000 * 0.7375621
		result.TQSurf = &val
	}

	// 立管压力的转换
	if result.VerticalPipePress != nil {
		val := *result.VerticalPipePress / 0.06895
		result.VerticalPipePress = &val
	}

	// 入口流量的单位换算
	if result.Q != nil {
		val := *result.Q / 3.7854
		result.Q = &val
	}

	// 钻时的转换
	if result.ROP != nil {
		val := *result.ROP * 3.28084
		result.ROP = &val
	}

	// 钻压的转换
	if result.WOB != nil {
		val := *result.WOB * 9.8 * 1000 * 0.2248089
		result.WOB = &val
	}

	return result
}

// CalculateMSE 四个计算公式
func CalculateMSE(obj MSEData, D, deltaP, Kn, Kt float64) (float64, float64, float64, float64) {
	// 使用安全获取浮点数值
	wob := safeFloat(obj.WOB)
	tqSurf := safeFloat(obj.TQSurf)
	rpmSurf := safeFloat(obj.RPMSurf)
	rop := safeFloat(obj.ROP)
	q := safeFloat(obj.Q)

	// 计算mse_total
	mseTotal := 4*wob/(math.Pi*math.Pow(D, 2)) +
		480*((tqSurf-Kt*deltaP)*rpmSurf+Kt*deltaP*(rpmSurf+Kn*q))/(math.Pow(D, 2)*rop)

	// 计算mse_downhole
	mseDownhole := 4*wob/(math.Pi*math.Pow(D, 2)) +
		480*Kt*deltaP*(rpmSurf+Kn*q)/(math.Pow(D, 2)*rop)

	// 计算DOC
	DOC := (12.0 / 60.0) * rop / (rpmSurf + Kn*q)

	// 计算DS
	DS := 2 * wob / (DOC * D)

	return mseTotal, mseDownhole, DOC, DS
}

// safeFloat 安全获取浮点数值，如果为nil则返回0
func safeFloat(f *float64) float64 {
	if f == nil {
		return 0.0
	}
	return *f
}

// PrintMSEData 打印MSEData内容（用于调试）
func (m MSEData) PrintMSEData(chineseNames map[string]string) {
	fields := map[string]*float64{
		"depth":               m.Depth,
		"TQ_surf":             m.TQSurf,
		"RPM_surf":            m.RPMSurf,
		"vertical_pipe_press": m.VerticalPipePress,
		"Q":                   m.Q,
		"ROP":                 m.ROP,
		"WOB":                 m.WOB,
	}

	for field, value := range fields {
		if value != nil {
			chineseName := chineseNames[field]
			fmt.Printf("%s: %.2f\n", chineseName, *value)
		}
	}
}
